using System;
using System.Runtime.Serialization;

namespace BanZuiCloudControlAgent.Utils.Common
{
    /// <summary>
    /// JSON序列化异常类，用于表示JSON序列化和反序列化过程中发生的错误
    /// </summary>
    [Serializable]
    public class JsonSerializationException : Exception
    {
        /// <summary>
        /// 错误的数据类型
        /// </summary>
        public string DataType { get; }

        /// <summary>
        /// 操作类型（序列化或反序列化）
        /// </summary>
        public string OperationType { get; }

        /// <summary>
        /// 初始化JsonSerializationException类的新实例
        /// </summary>
        public JsonSerializationException() : base("JSON序列化或反序列化过程中发生错误")
        {
        }

        /// <summary>
        /// 使用指定的错误消息初始化JsonSerializationException类的新实例
        /// </summary>
        /// <param name="message">描述错误的消息</param>
        public JsonSerializationException(string message) : base(message)
        {
        }

        /// <summary>
        /// 使用指定的错误消息和对作为此异常原因的内部异常的引用来初始化JsonSerializationException类的新实例
        /// </summary>
        /// <param name="message">描述错误的消息</param>
        /// <param name="innerException">导致当前异常的异常</param>
        public JsonSerializationException(string message, Exception innerException) : base(message, innerException)
        {
        }

        /// <summary>
        /// 使用指定的错误消息、数据类型和操作类型初始化JsonSerializationException类的新实例
        /// </summary>
        /// <param name="message">描述错误的消息</param>
        /// <param name="dataType">错误的数据类型</param>
        /// <param name="operationType">操作类型（序列化或反序列化）</param>
        public JsonSerializationException(string message, string dataType, string operationType) 
            : base(message)
        {
            DataType = dataType;
            OperationType = operationType;
        }

        /// <summary>
        /// 使用指定的错误消息、数据类型、操作类型和内部异常初始化JsonSerializationException类的新实例
        /// </summary>
        /// <param name="message">描述错误的消息</param>
        /// <param name="dataType">错误的数据类型</param>
        /// <param name="operationType">操作类型（序列化或反序列化）</param>
        /// <param name="innerException">导致当前异常的异常</param>
        public JsonSerializationException(string message, string dataType, string operationType, Exception innerException) 
            : base(message, innerException)
        {
            DataType = dataType;
            OperationType = operationType;
        }

        /// <summary>
        /// 使用序列化数据初始化JsonSerializationException类的新实例
        /// </summary>
        /// <param name="info">SerializationInfo，它存有关于所引发的异常的序列化的对象数据</param>
        /// <param name="context">包含有关源或目标的上下文信息</param>
        protected JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context)
        {
            DataType = info.GetString("DataType");
            OperationType = info.GetString("OperationType");
        }

        /// <summary>
        /// 使用可序列化的数据填充SerializationInfo
        /// </summary>
        /// <param name="info">要填充数据的SerializationInfo</param>
        /// <param name="context">此序列化的目标</param>
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
            info.AddValue("DataType", DataType);
            info.AddValue("OperationType", OperationType);
        }
    }
} 